#include<iostream>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<cstdlib>
#include<cstdio>
#include<cassert>
#include<string.h>
#include<string>
#include<cerrno>

using namespace std;

int main()
{
    umask(0);
    if (mkfifo("mypipe", 0644) < 0)
    {
        perror("mkfifo");
        exit(-1);
    }
    int rfd = open("mypipe", O_RDONLY);
    if (rfd < 0)
    {
        perror("open");
        exit(-1);
    }
    char buf[1024];
    while (1)
    {
        printf("Please wait...\n");
        ssize_t s = read(rfd, buf, sizeof(buf)-1);
        if (s > 0)
        {
            buf[s - 1] = 0;
            printf("client say# %s\n", buf);
        }
        else if (s == 0)
        {
            printf("client quit, exit now!\n");
            exit(EXIT_SUCCESS);
        }
        else
        {
            perror("read");
            exit(-2);
        }
    }

    close(rfd);
    return 0;
}
// int main()
// {
//     umask(0);
//     if(mkfifo("mypipe",0664) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     int fd=open("mypipe",O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-1);
//     }
//     char buffer[1024];
//     while(true)
//     {
//         cout<<"Please Wait..."<<endl;
//         //通过管道从客户端读取数据
//         ssize_t s=read(fd,buffer,strlen(buffer));
//         if(s > 0)
//         {
//             buffer[s-1]=0;
//             cout<<"client say:>"<<buffer<<endl;
//             //读取数据成功以后不能终止进程
//         }
//         else if(s == 0)
//         {
//             cout<<"client quit now!"<<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
//     close(fd);
//     return 0;
// }
// int main()
// {
//     umask(0);
//     if(mkfifo("mypipe",0664) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     int fd=open("mypipe",O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-1);
//     }
//     char buffer[1024];
//     //这里需要反复地读取消息
//     while(true)
//     {
//         cout<<"Please Wait"<<endl;
//         ssize_t s=read(fd,buffer,strlen(buffer));
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
//             break;
//         }
//         else if(s == 0)
//         {
//             cerr<<"read end of file"<<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
//     close(fd);
//     return 0;
// }
// int main()
// {
//     umask(0);
//     if(mkfifo("mypipe",0644) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     int fd=open("mypipe",O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-1);
//     }
//     char buffer[1024]={0};
//     while(true)
//     {
//         memset(buffer,'\0',1024);
//         ssize_t s=read(fd,buffer,strlen(buffer));
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"] client say:"<<buffer<<endl;
//             break;
//         }
//         else if(s == 0)
//         {
//             cerr<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//         close(fd);
//     }
//     return 0;
// }
// int main()
// {
//     umask(0);
//     //给这个管道命名
//     if(mkfifo("mypipe",0644) < 0)
//     {
//         perror("open");
//         exit(-1);
//     }

//     int fd=open("mypipe",O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-1);
//     }
//     char buffer[1024];
//     while(true)
//     {
//         buffer[0]=0;
//         cout<<"Please Wait"<<endl;

//         //服务端已经通过文件描述符将代码写到了
//         ssize_t s=read(fd,buffer,strlen(buffer));
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<"client say:>"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cout<<"client quit,exit now!"<<endl;
//             exit(-1);
//         }
//         else
//         {
//             perror("read");
//             exit(-1);
//         }
//     }
//     close(fd);
//     return 0;
// }